package morning.cat.contract;

import feign.Contract;
import feign.MethodMetadata;
import feign.Request;
import morning.cat.annotation.MyUrl;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @describe: 处理类注解、处理方法注解、处理参数注解
 * @author: morningcat.zhang
 * @date: 2019/6/4 3:14 PM
 * <p>
 * 一个Contract实际上承担的是一个翻译的作用，将第三方（或者自定义）注解的作用告诉Feign。
 * 在Spring Cloud中，也实现了Spring的Contract，可以在接口中使用@RequestMapping注解，读者在学习Spring Cloud整合Feign时，见到使用@RequestMapping修饰的接口，就可以明白其中的原理。
 */
public class MyContract extends Contract.BaseContract {

    @Override
    protected void processAnnotationOnClass(MethodMetadata data, Class<?> clz) {

    }

    /**
     * 用于处理方法级的注解
     */
    @Override
    protected void processAnnotationOnMethod(MethodMetadata data,
                                             Annotation annotation, Method method) {
        // 是MyUrl注解才进行处理
        if (MyUrl.class.isInstance(annotation)) {
            // 获取注解的实例
            MyUrl myUrlAnn = method.getAnnotation(MyUrl.class);
            // 获取配置的HTTP方法
            String httpMethod = myUrlAnn.method();
            // 获取服务的url
            String url = myUrlAnn.url();
            // 将值设置到模板中
            data.template().method(Request.HttpMethod.valueOf(httpMethod));
            data.template().uri(url);
        }
    }

    @Override
    protected boolean processAnnotationsOnParameter(MethodMetadata data,
                                                    Annotation[] annotations, int paramIndex) {
        return false;
    }
}
